Добавление поиска по LIKE в поле name на базе prisma nodejs

Для реализации поиска по LIKE в поле name с использованием Prisma, нужно использовать оператор contains или startsWith/endsWith в запросе. Эти операторы позволяют выполнять частичное совпадение строк, аналогично SQL LIKE.


Обновленный метод в сервисе

Вот как можно обновить метод getAllDocumentsByNameTypeId для поиска по LIKE в поле name и фильтрации по typeId:

typescript

async getAllDocumentsByNameTypeId(name: string, typeId: number) {
  return this.prisma.documents.findMany({
    where: {
      typeId: Number(typeId), // Преобразуем строку в число
      name: {
        contains: name, // Поиск по частичному совпадению (аналог SQL LIKE '%name%')
        mode: 'insensitive', // Не учитывать регистр (опционально)
      },
    },
  });
}


Объяснение кода

  1. findMany:
    • Используется для получения нескольких записей из базы данных, соответствующих условиям.
  2. where:
    • Условие фильтрации:
      • typeId: Number(typeId): Фильтрует записи по typeId.
      • name: { contains: name }: Выполняет поиск по частичному совпадению строки в поле name. Это аналог SQL LIKE '%name%'.
      • mode: 'insensitive': Делает поиск нечувствительным к регистру (например, Document и document будут считаться совпадением).
  3. Возвращаемое значение:
    • Метод возвращает массив документов, соответствующих условиям.

Пример использования

Если вы вызываете этот метод из контроллера, он может выглядеть так:

typescript

import { Controller, Get, Query, NotFoundException } from '@nestjs/common';
import { ApiOperation, ApiResponse, ApiQuery } from '@nestjs/swagger';
import { DocumentsService } from './documents.service';

@Controller('documents')
export class DocumentsController {
  constructor(private readonly documentsService: DocumentsService) {}

  @ApiOperation({ summary: 'Получить список документов по названию и типу' })
  @ApiResponse({ status: 200, description: 'Документы успешно найдены.' })
  @ApiResponse({ status: 404, description: 'Документы не найдены.' })
  @ApiQuery({ name: 'name', required: false, description: 'Название документа' })
  @ApiQuery({ name: 'type_id', required: true, description: 'Тип документа' })
  @Get()
  async findDocuments(
    @Query('name') name: string,
    @Query('type_id') typeId: number,
  ) {
    const documents = await this.documentsService.getAllDocumentsByNameTypeId(
      name,
      typeId,
    );

    if (!documents || documents.length === 0) {
      throw new NotFoundException('Документы не найдены.');
    }

    return documents;
  }
}


Пример запросов

  1. Поиск по названию документа (частичное совпадение):javascriptGET /documents?name=Doc&type_id=1
    • Найдет все документы, у которых name содержит Doc (например, Document 1MyDoc).
  2. Поиск только по типу документа:javascriptGET /documents?type_id=1
    • Найдет все документы с type_id = 1.
  3. Поиск по названию и типу:javascriptGET /documents?name=Doc&type_id=2
    • Найдет документы, у которых name содержит Doc и type_id = 2.

Особенности Prisma

  • contains: Аналог SQL LIKE '%value%'.
  • startsWith: Аналог SQL LIKE 'value%'.
  • endsWith: Аналог SQL LIKE '%value'.
  • mode: 'insensitive': Делает поиск нечувствительным к регистру.